//package com.example.demo.client;
//
//import com.example.demo.server.protocol.template.CMPP_DELIVER;
//import com.example.demo.server.protocol.template.CMPP_DELIVER_RESP;
//import com.example.demo.server.protocol.template.CMPP_SUBMIT;
//import io.netty.bootstrap.Bootstrap;
//import io.netty.channel.ChannelFuture;
//import io.netty.channel.ChannelInitializer;
//import io.netty.channel.ChannelOption;
//import io.netty.channel.EventLoopGroup;
//import io.netty.channel.nio.NioEventLoopGroup;
//import io.netty.channel.socket.SocketChannel;
//import io.netty.channel.socket.nio.NioSocketChannel;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.io.UnsupportedEncodingException;
//import java.util.ArrayList;
//import java.util.List;
//
//public class Client {
//    private static final Logger LOGGER = LoggerFactory.getLogger(Client .class);
//
//    private static CmppInboundHandler INBOUND_MESSAGE_HANDLER;
//
//    public static void sendReportResp(ChannelContext ctx, CMPP_DELIVER cmppDeliver) {
//        deliverDownstream(ctx, cmppDeliver);
//    }
//
//    /**
//     * 连接服务器
//     *
//     * @param port
//     * @param host
//     * @throws Exception
//     */
//    public void connect(int port, String host,String content) throws Exception {
//        // 配置客户端NIO线程组
//        EventLoopGroup group = new NioEventLoopGroup();
//        try {
//            // 客户端辅助启动类 对客户端配置
//            Bootstrap b = new Bootstrap();
//            b.group(group)//
//                    .channel(NioSocketChannel.class)//
//                    .option(ChannelOption.TCP_NODELAY, true)//
//                    .handler(new ClientChannelHandler());//
//            // 异步链接服务器 同步等待链接成功
//            ChannelFuture f = b.connect(host, port).sync();
//
//            // 发送消息
//            String srcCode = "950160";
//            String secret = "501026";
//            String srcId = "000164";
//            String terminalId = "17663731642";
//            sendMessage("13", host, port, srcId, secret, 1, 3, srcId, terminalId, content);//        Thread.sleep(5 * 1000);
//
//            // 等待链接关闭
//            f.channel().closeFuture().sync();
//
//        } finally {
//            group.shutdownGracefully();
//            System.out.println("客户端优雅的释放了线程资源...");
//        }
//
//    }
//
//    /**
//     * @param seqId      信息seqId
//     * @param srcId      发信人
//     * @param terminalId 谁接收
//     * @param content    内容是什么
//     */
//    public static void sendMessage(String spId, String host, int port, String srcCode, String secret, int poolSize, int seqId, String srcId, String terminalId, String content) throws UnsupportedEncodingException, NoSuchFieldException, NoUsableChannelException {
//        List<String> shortMsg = splitLongContentIfNecessary(content);
//        if (shortMsg != null) {
//            LOGGER.info("开始走长短消息");
//            int size = shortMsg.size();
//            for (int i = 0; i < size; i++) {
//                String splitContent = shortMsg.get(i);
//                LOGGER.info("本次发送内容:{}", splitContent);
//                int actualSeqId = seqId;
//                if (i != 0) {
//                    actualSeqId = seqId + Integer.MAX_VALUE;
//                }
//                LOGGER.info("第{}条短信使用seqID{}", i, actualSeqId);
//                CMPP_SUBMIT msg = generateSendMsg(actualSeqId, size, i + 1, 1, srcCode, srcId, terminalId, splitContent);
//                msg.setLongMsgUnicode((byte) seqId);//设置udhi头使用, 长短信特有
//                getChannelContext(spId, host, port, srcCode, secret, poolSize).downStream(msg);
//            }
//        } else {
//            LOGGER.info("开始走单发短消息");
//            CMPP_SUBMIT content1 = generateSendMsg(seqId, 1, 1, 0, srcCode, srcId, terminalId, content);
//            getChannelContext(spId, host, port, srcCode, secret, poolSize).downStream(content1);
//        }
//
//    }
//
//    /**
//     * 获取channel
//     */
//    private static ChannelContext getChannelContext(String spId, String host, int port, String srcCode, String secret, int poolSize) throws NoUsableChannelException {
//        return ChannelContextPoolGroup.getWritableChannel(spId, host, port, srcCode, secret, poolSize);
//    }
//
//    /**
//     * 如果长度符合切分条件, 切分短信, 否则返回null
//     */
//    private static List<String> splitLongContentIfNecessary(String s) {
//        if (s.length() > GlobalConstant.CUT_THRESHOLD) {
//            ArrayList<String> splitContents = new ArrayList<>();
//            for (int i = 0; i < s.length(); i += GlobalConstant.CUT_UNIT) {
//                int thisContentEnd = i + GlobalConstant.CUT_UNIT;
//                splitContents.add(s.substring(i, thisContentEnd > s.length() ? s.length() : thisContentEnd));
//            }
//            return splitContents;
//        }
//        return null;
//    }
//
//    public class GlobalConstant {
////        private static final Logger LOGGER = LoggerFactory.getLogger(GlobalConstant.class);
//        /**
//         * 切分短信的阈
//         */
//        public static final int CUT_THRESHOLD = 70;
//
//        /**
//         * 如果切分短信, 单条短信的长度
//         */
//        public static final int CUT_UNIT = 67;
//        /**
//         * 单条短信最大长度
//         */
//        public static final int CUT_MSG_LENGTH = CUT_UNIT * 2;
//
//    }
//
//    private static CMPP_SUBMIT generateSendMsg(int seqId, int pkTotal, int pkNumber, int udhi, String msgSrc, String srcId, String terminalId, String msgContent) throws UnsupportedEncodingException, NoSuchFieldException {
//        if (pkTotal < 1 || pkNumber < 1 || pkNumber > pkTotal) {
//            throw new RuntimeException("参数不对,[" + pkTotal + "][" + pkNumber + "]");
//        }
//        CMPP_SUBMIT cmpp_submit = new CMPP_SUBMIT(seqId);
//        cmpp_submit.setMsgId(0);//空
//        cmpp_submit.setPkTotal((byte) pkTotal);//一共几条短信
//        cmpp_submit.setPkNumber((byte) pkNumber);//第几条短信
//        cmpp_submit.setRegisteredDelivery((byte) 1);//是否返回状态报告, 返回
//        cmpp_submit.setMsgLevel((byte) 1);//随意
//        cmpp_submit.setServiceId("0XCAFEBABE");//随意
//        cmpp_submit.setFeeUserType((byte) 0);//
//        cmpp_submit.setFeeTerminalId("");
//        cmpp_submit.setTpPid((byte) 0);//标准点到点协议
//        cmpp_submit.setTpUdhi((byte) udhi);
//        cmpp_submit.setMsgFmt((byte) 8);//ucs2编码
//        cmpp_submit.setMsgSrc(msgSrc);
//        cmpp_submit.setFeeType("01");
//        cmpp_submit.setFeeCode("000000");
//        cmpp_submit.setValidTime("");
//        cmpp_submit.setAtTime("");
//        cmpp_submit.setSrcId(srcId);
//        cmpp_submit.setDestUsrTl((byte) 1);
//        cmpp_submit.setDestTerminalId(terminalId);
//        cmpp_submit.setMsgContent(msgContent);//长短信时,+6字节头
//        cmpp_submit.setMsgLength((byte) cmpp_submit.getMsgContent().length);
//        cmpp_submit.setReserve("");
//        return cmpp_submit;
//    }
//
//    /**
//     * 网络事件处理器
//     */
//    private class ClientChannelHandler extends
//            ChannelInitializer<SocketChannel> {
//        @Override
//        protected void initChannel(SocketChannel ch) throws Exception {
//            ch.pipeline().addLast(new ClientHandler());
//        }
//    }
//
//    private static void deliverDownstream(ChannelContext ctx, CMPP_DELIVER cmppDeliver) {
//        CMPP_DELIVER_RESP cmpp_deliver_resp = new CMPP_DELIVER_RESP(cmppDeliver.seqId());
//        cmpp_deliver_resp.setMsgId(cmppDeliver.getMsgId());
//        cmpp_deliver_resp.setResult((byte) 0);//默认调用这个方法就是就是接收成功了
//        ctx.downStream(cmpp_deliver_resp);
//    }
//
//    public static void main(String[] args) throws Exception {
//        String host = "localhost";
//        int port = 8080;
//        String content = "如今我们一天各一方, 生活像周围人一样. 眼前人给我最信任的依赖, 但愿你被温柔对待.";
//        new Client().connect(port,host,content);
//
//    }
//}
